マルチブートの仕方(裏技編)
さてNTLDRでWindows9x系OSのマルチブートができない理由は「Windows初級編」で説明した。しかし、だったら同一パーティションに名前を変えて、ブートセクターやIO.SYSを配置してしまえば、可能になるのではないかというのが、今回の裏技の発想だ。シーケンス図でいうと以下のようなイメージである。
[図1 WindowsNTのブートシーケンス]
ブートセクターファイルを改造し、IO.SYSではなく、例えば「IO.98」を読むようにする。図にはないが、次のMSDOS.SYSも違うものを用意しなければいけないのでIO.98はそのファイル名だけでなく、次に読むファイルをMSDOS.SYSから、例えば「MSDOS.98」を読むように改造する必要がある。
これをWindows98用とWindows95用に2つを用意して、NTLDRにそれぞれの別のブートセクターファイルを読み込ませるようにboot.iniを書き換えれば、NTLDRによるWindows95とWindows98のデュアルブートが完成する。
しかしバイナリプログラムである、ブートセクターのIPLやIO.SYSの動きを変える(次に読むファイルを変える)には、普通はソースファイルを変更してコンパイルしなおさなければならない。しかし幸いこれらのプログラムをバイナリエディタで開くと、ちゃんと次に読むファイルがテキストで書かれていて、容易に書き換えることができる。バイナリファイルであるこれらのファイルを直接変更してしまうことができる。昔はよくやったパッチ当ての作業である。
これまでの記述を熟読して、既にマルチブートに慣れてきて、NTLDRによるマルチブートの仕組みを完全に理解できている人はここまで聞けば、どうやればこれが実現できるかわかるだろう。早速やってみてほしい。
しかし上記の方法論だけでは、実際どう行うのか分からない人は、さらにこのページを読み進んでほしい。ただしNTLDRによる起動の仕組みを前ページまでで十分理解した上で行ってほしい。
では、具体的にNTLDRによるWindows95とWindows98のマルチブート環境の構築の手順を示そう。理論が分かればどのような方法、順序でも可能だが、最も間違いの少ないオーソドックスな手順で説明する。
まず普通にWindows95をCドライブにインストールしよう。その後でWindowsNT/2000をDドライブにでもインストールする。とりあえずWindows95とWindowsNT/2000のデュアルブートはこれでできることは以前から説明している。
それぞれのインストールが終わったら早速ファイル書き換え作業だが、この作業はWindows95上でもできるが一応WindowsNT/200上で行ってほしい。
まずブートセクターファイル「bootsect.dos」を「boot95.dos」とでも改名しよう。「IO.SYS」も「IO.S95」とする。また「MSDOS.SYS」も「MSDOS.S95」に改名する。IO.SYSとMSDOS.SYSはなるべくファイル名長が変わらないような改名にしよう。一応念のため、元の3つファイルはちゃんとバックアップはとっておいてほしい。
バイナリエディタは、窓の杜やヴェクターから適当なものを探してほしい。私は「BZ」というソフトを使っている。まず具体的なブートセクターファイルの編集から説明しよう。BZを起動してboot95.dosを開く。
[図2 ブートセクターファイル(boot95.dos)のバイナリ編集]
アドレス1D8あたりに、「IO.SYS」と「MSDOS.SYS」と書かれているが見える。ここをそれぞれ「IO.S95」と「MSDOS.S95」に書き換える。ブートセクターファイルの編集はこの部分だけだ。
次に元IO.SYSである、「IO.S95」を編集する。
[図3 IO.S95のバイナリ編集]
こちらは何箇所か「MSDOS.SYS」と書かれているところがあるので、すべて検索して悉く「MSDOS.S95」に書き換える。その中には単なるコメントやエラーメッセージ用のものもあると思うが、一応全部変更しておこう。「IO.SYS」の部分は特に書き換えなくても正しく動作する。
元のMSDOS.SYSであるMSDOS.S95は内容の編集はしないが、以下のような内容になっていることは確認してほしい。この内容が実はとても重要なので、どのようなものなのか理解しておいてほしい。
[MSDOS.S95の内容]
[Paths] WinDir=C:\WINDOWS WinBootDir=C:\WINDOWS HostWinBootDrv=C [Options] BootMulti=1 BootGUI=1 Network=0 ; ;The following lines are required for compatibility with other programs. ;Do not remove them (MSDOS.SYS needs to be >1024 bytes). |
この「Paths」セクションの記述が重要だ。ここにWindowsディレクトリが書かれているのでそこのWindowsが起動する訳である。
さあ、これらの改造で「boot95.dos」->「IO.S95」->「MSDOS.S95」->「C:\Windows」という独自のWindows95を起動するシーケンスが完成した。最後にboot.iniを編集してNTLDRで起動してみよう。
boot.iniのWindowsを起動するエントリを以下のように、boot95.dosを読むようなエントリに変更する。
[boot.iniの内容]
[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00" multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00 [VGA mode]" /basevideo /sos C:\boot95.dos = "Microsoft Windows 95 OSR2" |
さて、これで再起動してみよう。正しくIO.S95などを読んで起動できているかを確認するため、不安かもしれないが、Cドライブのルートには元のIO.SYSなどは置いておかないようにしよう。
[NTLDRによるOS選択画面]
OS Loader V4.00 オペレーティング システムの選択
↑ キーと ↓ キーを使って、起動するオペレーティング システムを選択し、 Enter キーを押してください。 システムが自動的に起動するまで:30 |
手順を間違えていなければ「Microsoft Windows 95 OSR2」を選択すれば、Windows95が起動するはずだ。もし起動しないようなら手順をもう一度見直して、バックアップしておいたデータからまた構築し直してほしい。
次にマルチブートしたい別のWindows9x系OSをインストールする。ここでは「Windows98」をインストールしてみよう。
Windows95と同じパーティションにWindowsディレクトリ名だけ変えてインストールすることも可能だが、その場合、「Program Files」フォルダが共有されることになるので、あまり好ましくない。できれば別のドライブ(パーティション)をWIndowsディレクトリとして選択しよう。ここではWindows95もWindowsNTもインストールされていないEドライブ(E:\WindowsをWindowsディレクトリに指定)を選択する。
Windows98は基本的には、WindowsNTによるマルチブートの仕組みを知っているので、その環境を維持してくれるはずだ。インストールが完了すると次のような起動画面が見れるはずである。
[Windows98インストール後OS選択画面]
OS Loader V4.00 オペレーティング システムの選択
↑ キーと ↓ キーを使って、起動するオペレーティング システムを選択し、 Enter キーを押してください。 システムが自動的に起動するまで:30 |
これで「Microsoft Windows 98」を選択すれば、Windows98が、「Microsoft Windows 95 OSR2」を選択すれば、「Windows95」が起動するという、NTLDRによるWindows9x系OSのマルチブートの完成である。
ただしもしこの起動画面が出てこないで、即Windows98が起動してしまったら、それはブートセクターが書き換えられたと考えられるのでWindowsNT側でブートセクターの修復を行ってほしい。
もし起動OSがこれだけでいいのなら本当にこれで終了だ。まあ起動メニューの文言やデフォルトOSなどは適当に変更してほしい。それぞれの起動シーケンスは以下のようになっている。
[Windows95の起動シーケンス]
NTLDR -> boot95.dos -> IO.S95 -> MSDOS.S95 -> C:\Windows
[Windows98の起動シーケンス]
NTLDR -> bootsect.dos -> IO.SYS -> MSDOS.SYS -> E:\Windows
ただし更に別のWindows9x系OSをインストールしたい場合、やはりWindows98も、先のWindows95同様に各種ブートファイルの改造を施す。
NTLDR -> boot98.dos -> IO.S98 -> MSDOS.S98 -> E:\Windows
このようにした上で、また別のOSをインストールする。結局あとはこれらの繰り返しということになる。次のような究極のマルチブート環境の構築も夢ではない。
[究極のマルチOS]
OS Loader V4.00 オペレーティング システムの選択
↑ キーと ↓ キーを使って、起動するオペレーティング システムを選択し、 Enter キーを押してください。 システムが自動的に起動するまで:30 |
因みに環境構築にWindowsNT/2000は必須だが、もし環境構築後、これらのOSが必要ないなら、ブートに必要なNTLDRなど以外のWINNTディレクトリなどは消してしまっても構わない。ただしブートセクターが壊れた時のブートセクターの修復がWINNTディレクトリがないとできない場合があるので、できれば残しておいた方がいいかと思う。
この方法は裏技と書いたが、原理的にはいくつかの市販のブートローダが行っている同一パーティション内に複数のOSのインストールをサポートする場合に使っている方法だ。これらのローダの場合は起動時にIO.SYSなどをダイナミックに書き換えたりしているようだが、動作原理的には同じことである。
NTLDRでは通常他の領域のブートセクターをロードする機能はない。また領域のアクティブ化や隠しパーティションの機能もないので、通常はNTLDRのある領域が必ずCドライブとなるため、別々の基本領域が起動時にそれぞれがCドライブとなるようなマルチブートを実現するためには他のMBR導入型ローダが必要であることは今までも説明してきた。
しかし機能編で説明しているドライブレターの振られる原理を逆に利用して、非常に限定された構成でしか実現はできないが、一応NTLDRを用いても他の領域のブートセクターをロードして、各OSの自分の領域がCドライブとなるような起動を行うことができる。
もっとも優れたフリーのMBR導入型ローダが簡単に入手でき、そのようなローダを使えば簡単にできることを何も無理やり、そのようなことが不得手なNTLDRにやらせる必然性などない。しかしここでこの裏技を紹介するのは、NTLDRの性質、さらにはブートの動作原理を理解する上で非常に興味深い事実も含んでいるからだ。
このような裏技が存在する原理からお話する必要がある。以下の図を参考にWindows95の通常のブートシーケンスとWindows95のNTとのマルチブート環境におけるNTLDRによるブートシーケンスの違いを見てほしい。
[図4 Windows95の通常のブートシーケンス]
[図5 Windows95のNTLDRによるブートシーケンス]
後者の「Bootsect.dos」というファイルは、前者のブートセクターをファイル化したものであることは説明した。ここで注目してほしいのは、IO.SYSが読み込まれる直前の段階だ。この時PCのメモリ上は前者の場合「ブートセクター」が後者の場合「Bootsect.dos」がいて、実行されている。内容は同じものなので、同じ動作を行い、次段の作業となるIO.SYSを読み込もうとしている訳である。
実はこの段階で両者は全く同じ状態になっている。それ以前の段階がどのような段階を踏んで来たかなどはもはや関係ない状態になっているのだ。(もっともこれは、NTLDRがあたかもブートセクターをMBRのブートストラップローダがロードしたかのように装うために全く同じメモリアドレス上にロードするからそうなるのだが) そして更に興味深いのは、ブートセクターやBootsect.dosのそれぞれのハードディスク上の元のロケーションが、一旦メモリにロードされて実行されたのならば、もはや全くその後の動作に関係してこないことである。
ここで私の言いたいことが理解してもらえるだろうか? もう少し事例を紹介しよう。以下の図を見てほしい。基本領域1にある「Bootsect.dos」は、基本領域2のブートセクターをファイル化したものだ。これを基本領域1のNTLDRに読み込ませると、何と次に基本領域2の「IO.SYS」を読むのだ。そしてちゃんと基本領域2をCドライブとして、ここにあるWindows98が起動する。勿論Windows2000を選択すれば正常に基本領域1をCドライブとしてWindows2000が起動される。あたかもMBR導入型ブートローダでアクティブ切り替えを行ってブートしているかのようになる訳である。
[図6 NTLDRによる他の領域の起動1]
この構成のポイントは、基本領域1のファイルシステムがNTFSであること、そこがアクティブであること、及び基本領域2にWindows98がいることだ。NTLDRによってロードされた「Bootsect.dos」(正確にはその中のDOS-IPL)は次に読むべきIO.SYSを自分の元のロケーションとは無関係に、あくまで自分の(この場合Windows98の)ドライブレター認識順序に従って決定したCドライブから探すのである。
「隠しパーティションとブートマネージャ」を確認してほしい。あるOSにとって知らないファイルシステムがある領域はドライブレターが振られない。上記例の場合、Windows98にとってNTFSは知らない領域なので、ドライブレターの割り振りから外され、基本領域2がCドライブとなる。よって基本領域1にあるNTLDRによってロードされたBootsect.dosでも、その法則に従って、基本領域2のIO.SYSを読み込み、その後の動作も全く同様に基本領域2をCドライブと認識し続けるので、そのままここをCドライブとして、首尾よくWindows98が起動するといった寸法だ。
この原理を更に確認すべく以下の図をご覧ほしい。上記構成に加え、更にもう一つの基本領域があり、ここにはファイルシステムがFAT16でWindows95の初期バージョン(OSR2以前)がインストールされている。そしてこの領域のブートセクターをファイル化して(例では「Bootsect.95」というファイル名にしてある)、基本領域1に置き、NTLDRにロードさせる。
[図7 NTLDRによる他の領域の起動2]
Windows95の初期バージョンはファイルシステムFAT32を知らないのでこの場合、基本領域1に加え、基本領域2もドライブレターが振られない。結局基本領域3がCドライブになるので基本領域1に置いて、NTLDRによってロードされた「Bootsect.95」は次に基本領域3のIO.SYSを読みに行き、やがてこの領域をCドライブとして、Windows95Aが起動する。
結局、基本領域1にいるNTLDRが3つの基本領域の起動し分けるている訳である。NTLDRには他の領域のブートセクターを直接ロードする機能はないが、ファイル化して同じ領域に持ってきてしまえばこのようなことが可能になる。
もっともパーティション構成はある程度限定される。アクティブ切り替えも、隠しパーティション機能も使えない以上、ドライブレター割り振りの順序(この場合、特に重要なCドライブがどこになるか)はひとえにパーティションの位置関係とそこにあるOSのファイルシステム認識度に依存する。
上記例で基本領域3のOSがもしWindows95 OSR2なら、もうこの構成は破綻する。Windows95 OSR2はFAT32を知っているので、上記例の場合、やはり基本領域2がCドライブとなってしまい(よって「Bootsect.95」は基本領域2のIO.SYSを読んでしまう)、基本領域3のOSは起動されない。また基本領域2と基本領域3の順序も重要だ。Windows98はFAT16を知っている訳だから、前にFAT16があるとそちらをCドライブとしてしまうから、上記例の順序を変えることはできない。
逆にNTLDRの置かれるパーティションはある程度位置的には自由だ。こちらはアクティブとなるので、後ろのほうにあっても必ずCドライブとなり得るからである。気にしなければならにのはブートコード領界くらいだろう。
ところで上記例のような構成を特別なツールを使わずに構築することができるのだろうか? これはちゃんと出来る。基本的に位置順序に従ってインストールしていく。基本領域1のWindows2000のインストールは勿論問題ないだろう。次の基本領域2へのWindows98のインストールだがこれも問題ない。Windows98のFDISKはNTFSを非MS-DOS領域とするので別にちゃんと基本領域を作れる。ただしインストール時に一旦基本領域2をアクティブにする。基本領域3にWindows95Aをインストールする時も同じである。
3つの領域にそれぞれのOSのインストールが完了したら次に行うのが、FATのブートセクターのファイル化だ。Windows95などがインストールされている領域にWindowsNTをインストールすると自動的にブートセクターがファイル化されることは説明してきた。ではいちいちブートセクターのファイル化のために一旦それぞれの領域にWindowsNTをインストールするのだろうか。実はそんな必要はない。DOSのDebugというコマンドで簡単にブートセクターをファイル化できる。
[DEBUGコマンドによるブートセクターのファイル化]
C:\> debug -L 100 2 0 1 -N bootsect.98 -R BX BX 0000 :0 -R CX CX 0000 :200 -W 00200 バイト書き込み中 -Q C:\> |
Nコマンドのファイル名は任意だが、あとは上記の通りに入力してほしい。これをFAT32領域、FAT16領域でそれぞれ行いNTFS領域にコピーする。後は以下のようにboot.iniを編集するだけである。
[boot.iniの編集]
[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect C:\bootsect.98="Microsoft Windows 98" C:\bootsect.95="Microsoft Windows 95 A" |
以下のような起動メニューが出れば、後は選択起動するだけだ。
[NTLDRのOS選択画面]
オペレーティング システムの選択
↑ キーと ↓ キーを使って、起動するオペレーティング システムを選択し、 Enter キーを押してください。 システムが自動的に起動するまで: 30
|
ただし「図7」のような構成は非現実的だ。問題は基本領域3のWindows95Aで、ブートコード領界でも説明しているようにOSの制限からこの領域はハードディスクの先頭から2GB以内に置く必要がある。ということは基本領域1と基本領域2の双方で2GB以内に収める必要があるのである。今となってはこれは現実的な選択とは言えない。
そこで前述しているように、今回のNTFS領域はアクティブであるため後方に置けるので、これを第3基本領域として以下のように構成する。
[図8 NTLDRによる他の領域の起動3]
ただしこの構成にすると今度はインストール時の問題が起こる。この場合、Windows2000を最後にインストールする必要があるが、Windows2000のインストーラはFAT32なども知っているので、ここにブートセクターやNTLDRを置こうとする。これを防ぐためにインストール前に基本領域3を別のシステムを用いて(別のWindows2000に第2ハードディスクとして接続するなどして)NTFSで作成して、アクティブにしておく必要がある。
また、この手法を複数のハードディスクに跨って実現しようとしても通用しない。つまり第1ハードディスクを全てNTFSにしておいて、第2ハードディスクなどのFAT32上のブートセクターを第1ハードディスクのNTLDRに読み込ませて、第2ハードディスクのそのFAT32上にあるWindows98(確かにこのOSから見ると、第2ハードディスク上の当該パーティションはCドライブとなるが)を起動しようとしても起動できない。ハードディスクの順序まで誤魔化すことはできないようである。
まあ最初にも述べた通り、フリーのツールで可能なことなので特に実用的な裏技ではないが、原理としては面白い話だったと思う。